package com.robert.BCH;

import java.util.ArrayList;
import java.util.List;

public class cyclotomic {
    /**
     * 准备工作一：分圆域计算
     * 在产生了公共参数之后的第一步是要计算分圆域
     * 下面是计算的函数
     */
    //CycSet保存的是分圆陪集
    private List<List<Integer>> cycSet;
    private int[] auxiliary;

    //计算分圆陪集
    public void computeCycSet(parameters p){
        //auxiliary为向量形式，第i个位置为j，说明i+1属于第j个分圆陪集中
        auxiliary = new int[p.getN()-1];
        //初始化cycset
        cycSet = new ArrayList<>();
        int k = 0;
        for(int i=0;i<p.getN()-1;i++){
            if(auxiliary[i]==0){
                int temp = i+1;
                auxiliary[i] = temp;
                int index = temp;
                List<Integer> coSet = new ArrayList<>();
                coSet.add(index);
                for(int j=0;j<p.getN();j++){
                    index = (index*p.getMod())%p.getN();
                    if(auxiliary[index-1]==0){
                        auxiliary[index-1] = temp;
                        coSet.add(index);
                    }else {
                        break;
                    }
                }
                cycSet.add(coSet);
            }
        }
    }

    public List<List<Integer>> getCycSet() {
        return cycSet;
    }

    public int[] getAuxiliary() {
        return auxiliary;
    }
}
